将对象组合成树形结构来表示“整体/部分”层次关系,允许用户以相同的方式处理单独对象和组合对象。
组件(Component)类是组合类(Composite)和叶子类(Leaf)的父类,可以把组合类看成是树的中间节点。
组合对象拥有一个或者多个组件对象,因此组合对象的操作可以委托给组件对象去处理,而组件对象可以是另一个组合对象或者叶子对象。
publicabstractclassComponent { protectedStringname; publicComponent(Stringname) { this.name = name; } publicvoidprint() { print(0); } abstractvoidprint(intlevel); abstractpublicvoidadd(Componentcomponent); abstractpublicvoidremove(Componentcomponent); }
publicclassCompositeextendsComponent { privateList<Component> child; publicComposite(Stringname) { super(name); child = newArrayList<>(); } @Overridevoidprint(intlevel) { for (inti = 0; i < level; i++) { System.out.print("--"); } System.out.println("Composite:" + name); for (Componentcomponent : child) { component.print(level + 1); } } @Overridepublicvoidadd(Componentcomponent) { child.add(component); } @Overridepublicvoidremove(Componentcomponent) { child.remove(component); } }
publicclassLeafextendsComponent { publicLeaf(Stringname) { super(name); } @Overridevoidprint(intlevel) { for (inti = 0; i < level; i++) { System.out.print("--"); } System.out.println("left:" + name); } @Overridepublicvoidadd(Componentcomponent) { thrownewUnsupportedOperationException(); // 牺牲透明性换取单一职责原则,这样就不用考虑是叶子节点还是组合节点 } @Overridepublicvoidremove(Componentcomponent) { thrownewUnsupportedOperationException(); } }
publicclassClient { publicstaticvoidmain(String[] args) { Compositeroot = newComposite("root"); Componentnode1 = newLeaf("1"); Componentnode2 = newComposite("2"); Componentnode3 = newLeaf("3"); root.add(node1); root.add(node2); root.add(node3); Componentnode21 = newLeaf("21"); Componentnode22 = newComposite("22"); node2.add(node21); node2.add(node22); Componentnode221 = newLeaf("221"); node22.add(node221); root.print(); } }
Composite:root --left:1 --Composite:2 ----left:21 ----Composite:22 ------left:221 --left:3
- javax.swing.JComponent#add(Component)
- java.awt.Container#add(Component)
- java.util.Map#putAll(Map)
- java.util.List#addAll(Collection)
- java.util.Set#addAll(Collection)